// utils/request.js
/**
 * 封装请求函数
 * 在实际项目中，这里会处理真实的API请求
 * 在使用mock数据时，这个文件仍然保持相同的接口，但实际上是由MockJS拦截请求
 */

// 基础请求URL
const BASE_URL = ""; // 使用相对路径，方便MockJS拦截

/**
 * 封装GET请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @returns {Promise} - 返回Promise对象
 */
export const get = (url, params = {}) => {
  // 构建带查询参数的URL
  let requestUrl = url;
  if (Object.keys(params).length > 0) {
    const query = Object.keys(params)
      .map(
        (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
      )
      .join("&");
    requestUrl = `${url}?${query}`;
  }

  // 返回Promise
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + requestUrl,
      method: "GET",
      success: (res) => {
        // console.log("41564", requestUrl, res);
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else {
          reject(new Error(`请求失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

/**
 * 封装POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @returns {Promise} - 返回Promise对象
 */
export const post = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + url,
      method: "POST",
      data,
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else {
          reject(new Error(`请求失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

/**
 * 封装PUT请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @returns {Promise} - 返回Promise对象
 */
export const put = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + url,
      method: "PUT",
      data,
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else {
          reject(new Error(`请求失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

/**
 * 封装DELETE请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @returns {Promise} - 返回Promise对象
 */
export const del = (url, params = {}) => {
  // 构建带查询参数的URL
  let requestUrl = url;
  if (Object.keys(params).length > 0) {
    const query = Object.keys(params)
      .map(
        (key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`
      )
      .join("&");
    requestUrl = `${url}?${query}`;
  }

  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_URL + requestUrl,
      method: "DELETE",
      success: (res) => {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else {
          reject(new Error(`请求失败: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
};

export default {
  get,
  post,
  put,
  del,
};
